package cn.px.rest.controller.fill;

import cn.px.common.util.BeanConverterUtil;
import cn.px.common.util.R;
import cn.px.common.validation.group.AddGroup;
import cn.px.common.validation.group.UpdateGroup;
import cn.px.dao.bean.MyVOPage;
import cn.px.dao.dto.fill.FillExecuteDTO;
import cn.px.dao.entity.fill.FillExecute;
import cn.px.dao.util.ExcelUtil;
import cn.px.dao.vo.export.fill.ExportFillExecuteVO;
import cn.px.dao.vo.query.fill.FillExecuteVO;
import cn.px.rest.log.annotation.SysLog;
import cn.px.service.fill.FillExecuteService;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @Description 填报信息 控制器
 * @author 品讯科技
 * @date 2024-08
 * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
 */
@RestController
@AllArgsConstructor
@RequestMapping("/fill/executes")
public class FillExecuteController {

    private final FillExecuteService fillExecuteService;

    /**
     * 通过id查询单条记录
     *
     * @param id 主键
     * @return R
     */
    @GetMapping("/{id}")
    public R<FillExecute> getById(@PathVariable("id") String id) {
        return new R<>(fillExecuteService.getModelById(id));
    }


    /**
     * 通过id查询单条记录
     *
     * @param sbId    主键
     * @param useType :
     * @return R
     */
    @GetMapping("/sb/{sbId}/use-type/{useType}")
    public R selectBySbIdUseType(@PathVariable("sbId") String sbId, @PathVariable("useType") Integer useType) {
        return new R<>(fillExecuteService.selectFillListBySbIdUseType(sbId, useType));
    }


    /**
     * 新增记录
     *
     * @param fillExecuteDTO 填报信息DTO
     * @return R
     */
    @SysLog("新增填报信息")
    @PostMapping
    @PreAuthorize("@pms.hasPermission('fill-executes-add')")
    public R save(@Validated({AddGroup.class}) @RequestBody FillExecuteDTO fillExecuteDTO) {
        return new R<>(fillExecuteService.saveModelByDTO(fillExecuteDTO));
    }

    /**
     * 修改记录
     *
     * @param fillExecuteDTO 填报信息DTO
     * @return R
     */
    @SysLog("修改填报信息")
    @PutMapping("/{id}")
    @PreAuthorize("@pms.hasPermission('fill-executes-edit')")
    public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody FillExecuteDTO fillExecuteDTO) {
        fillExecuteDTO.setId(id);
        fillExecuteService.modModelByDTO(fillExecuteDTO);
        return new R<>();
    }

    /**
     * 通过id删除一条记录
     *
     * @param id 主键
     * @return R
     */
    @SysLog("删除填报信息")
    @DeleteMapping("/{id}")
    @PreAuthorize("@pms.hasPermission('fill-executes-del')")
    public R removeById(@PathVariable String id) {
        fillExecuteService.deleteByPrimaryKey(id);
        return new R<>();
    }

    /**
     * 批量记录
     *
     * @param ids 主键
     * @return R
     */
    @SysLog("批量删除填报信息")
    @DeleteMapping("")
    @PreAuthorize("@pms.hasPermission('fill-executes-del')")
    public R removeIds(@RequestBody List<String> ids) {
        fillExecuteService.batchDelete(ids);
        return new R<>();
    }

    /**
     * 获取分页
     *
     * @param pageNum        当前页码
     * @param pageSize       每页条数
     * @param fillExecuteDTO 填报信息DTO
     * @return R
     */
    @GetMapping("/page")
    public R<MyVOPage<FillExecuteVO>> query(FillExecuteDTO fillExecuteDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
        return new R<>(fillExecuteService.selectPageList(fillExecuteDTO, pageNum, pageSize));
    }

    /**
     * 获取列表
     *
     * @param fillExecuteDTO 填报信息DTO
     * @return R
     */
    @GetMapping("")
    public R query(FillExecuteDTO fillExecuteDTO) {
        return new R<>(fillExecuteService.getModelListByDTO(fillExecuteDTO));
    }

    /**
     * 填报信息导出
     *
     * @param fillExecuteDTO 填报信息DTO
     * @return R
     */
    @GetMapping("/export")
    @SysLog("填报信息导出")
    @PreAuthorize("@pms.hasPermission('fill-executes-export')")
    public void export(HttpServletResponse response, FillExecuteDTO fillExecuteDTO) {
        List<FillExecute> list = fillExecuteService.getModelListByDTO(fillExecuteDTO);
        ExcelUtil.exportResponseDict(response, ExportFillExecuteVO.class, BeanConverterUtil.copyListProperties(list, ExportFillExecuteVO.class), "填报信息");
    }

    /**
     * 批量修改作业
     *
     * @return R
     */
    @SysLog("批量修改作业")
    @PutMapping("/batch/update/project")
    public R batchUpdateProject(@RequestBody FillExecuteDTO model) {
        fillExecuteService.batchUpdateProject(model);
        return new R<>();
    }

}
